package jus.poc.prodcons.v2;

import java.io.PrintStream;
import jus.poc.prodcons.*;

/**
 * Le Consommateur est la structure consommatrice de ressources de notre modèle.
 *
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Consommateur extends Acteur implements _Consommateur {

    protected int nbMessage;
    protected ProdCons buffer;
    protected int id;

    /**
     * Construction d'un consommateur.
     * @param type le type de consommateur
     * @param obs l'observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @throws ControlException 
     */
    protected Consommateur(int type, Observateur obs, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement) throws ControlException {

        super(type, obs, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        nbMessage = 0;
    }

    /**
     * Constructeur d'un consommateur à partir de l'id.
     *
     * @param obs l'observateur
     * @param moyenneTempsDeTraitement 
     * @param deviationTempsDeTraitement
     * @param buffer
     * @param id Le numero du consommateur
     * @throws ControlException
     */
    public Consommateur(Observateur obs, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement, ProdCons buffer, int id) throws ControlException {

        this(typeConsommateur, obs, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        this.buffer = buffer;
        this.id = id;
    }

    @Override
    public int nombreDeMessages() {
        return nbMessage;
    }

    @Override
    public void run() {
        while (1 == 1) {
            Aleatoire alea = new Aleatoire(moyenneTempsDeTraitement, deviationTempsDeTraitement);
            try {
                sleep(alea.next());  // On attend le prochain message.
                Message mes = buffer.get(this);
                ((MessageX) mes).setConsommateur(this.toString());
                sleep(alea.next());
                print(System.out, mes.toString());
                nbMessage++;
            } catch (InterruptedException e) {
            } catch (Exception e) {
                System.out.println("Exception Consommateur->run");
            }
        }
    }

    /**
     * Imprime le message dans dans la sortie spécifiée.
     *
     * @param sortie
     * @param message
     */
    private void print(PrintStream sortie, String message) {
        sortie.println(message);
    }

    @Override
    public String toString() {
        return "Conso" + id;
    }
}
